# -*- coding: utf-8 -*-
# @Author  : wml
# @Time    : 2024/12/6 14:58
# @File    : gpt.py
# @Software: PyCharm

import ast
import requests
import json


'''
调用gpt的接口（但是代理版），生成内容不是很好（怀疑是代理的问题，因为直接用gpt比这个调用接口效果好）
有时候返回的结果没有按照给定的格式来会报错
'''
API_KEY = 'sk-5zhAaV0qFvImB8EIB28cEdBe06Fc4d6d96C937448e97A47c'  # 替换为您的ChatGPT API密钥

# api.xiaoai.plus sk-5zhAaV0qFvImB8EIB28cEdBe06Fc4d6d96C937448e97A47c

def call_chatgpt_api(messages):
    response = requests.post(
        url="https://api.xiaoai.plus/v1/chat/completions",
        headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
        data=json.dumps({
            "model": "gpt-3.5-turbo",  # 或者你可以使用其他可用模型
            "messages": messages,
        })
    )
    return response

def generate_outline(name, background, style, tone):
    prompt = f"根据主角姓名“{name}”、游戏背景“{background}”和故事风格“{style}”,{tone}的叙述风格用生成一个游戏主线梗概"
    messages = [
        {"role": "system", "content": "你正在帮助生成一个基于文本的游戏场景。"},
        {"role": "user", "content": prompt}
    ]
    response = call_chatgpt_api(messages)
    # 假设响应是一个使用单引号的字符串
    outline = response.json()['choices'][0]['message']['content']
    return outline

def generate_game_content(outline, tone, chat_history, last_choice=None):
    if chat_history:
        if last_choice:
            prompt = f"根据上一场用户选择编号“{last_choice}”，用{tone}的叙述风格继续生成游戏场景，"
    else:
        prompt = f"根据游戏梗概{outline}用{tone}的叙述风格，生成一场游戏场景，你需要需要详细介绍游戏的背景、主角的身份和目标，"
    prompt += '''玩家是游戏主人公，使用第二人称，
    不要重复已经出现的情节，注意保持情节的一致性和连贯性，角色之间互动的合理性，
    每个场景的最后给出用户选项。游戏中主角有三个数值，数值会受到剧情发展的影响合理地增减，
    我希望游戏中出现性格鲜明的角色，能够推动剧情的发展或促进主角的成长。
    请在合适的时候结束游戏。
    你的返回必须是标准的json格式，请按照以下格式返回（不要用markdown格式）：'''
    prompt += '''
                {
                  "is_over": "[是否结束]"，//true or false
                  "attributes": {
                    "health": **数值**, // 用户当前的健康值
                    "experience": **数值**, // 用户当前的经验值
                    "wealth": **数值** // 用户当前的财富值
                  },
                  "content": [
                    {
                      "type": **1或2**, //1表示场景描述，2表示人物对话
                      "text": "[描述]",   //场景描述（仅当类型为场景描述时）
                      "name": "[角色名]",   //场景描述（仅当类型为人物对话时）
                      "dialogue": "[对话]" //角色的对话内容（仅当类型为人物对话时,只包含对话内容）
                    },
                    {
                      "type": **1或2**, //1表示场景描述，2表示人物对话
                      "text": "[描述]",   //场景描述（仅当类型为场景描述时）
                      "name": "[角色名]",   //场景描述（仅当类型为人物对话时）
                      "dialogue": "[对话]" //角色的对话内容（仅当类型为人物对话时,只包含对话内容）
                    },
                    ... // 给出关键选项前的每一个场景描述和人物对话，可以是多种组合形式，如场景-场景-人物-...，场景-人物-场景-...或场景-人物-人物-场景-人物-...，内容尽可能丰富
                  ]
                  "image_prompt": "[详细描述图片生成指令]" //用于生成背景图片的描述，尽可能描述详细
                  "options": [
                      {
                        "id": "[选项编号]",
                        "text": "[选项文本]"
                      }
                  ]
                }
                '''

    messages = [
        {"role": "system", "content": f"你正在帮助生成一个基于文本的游戏场景，这是游戏梗概：{outline}"},
        *chat_history,
        {"role": "user", "content": prompt}
    ]
    response = call_chatgpt_api(messages)
    # 假设响应是一个使用单引号的字符串
    game_scene_str = response.json()['choices'][0]['message']['content']

    return game_scene_str, response.json()['choices'][0]['message']


def print_attributes(attributes):
    print("当前健康值：", attributes['health'])
    print("当前经验值：", attributes['experience'])
    print("当前财富值：", attributes['wealth'])


def print_scene_content(contents):
    for content in contents:
        if content['type'] == 1:
            print("场景描述:", content['text'])
        else:
            character = content
            print(f"{character['name']}: {character['dialogue']}")


def get_user_inputs():
    name = input("请输入您的姓名: ")
    background = input("\n请输入故事背景:")

    print("\n请选择故事风格:")
    styles = {
        "1": "冒险",
        "2": "悬疑",
        "3": "浪漫",
        "4": "恐怖"
    }
    for key, value in styles.items():
        print(f"{key}: {value}")
    style_choice = input("请输入编号: ")
    style = styles.get(style_choice, "未知风格")

    print("\n请选择叙述语气:")
    tones = {
        "1": "正式",
        "2": "幽默",
        "3": "严肃",
        "4": "温馨"
    }
    for key, value in tones.items():
        print(f"{key}: {value}")
    tone_choice = input("请输入编号: ")
    tone = tones.get(tone_choice, "未知语气")
    print(name, background, style, tone)

    return name, background, style, tone

def main():
    name, background, style, tone = get_user_inputs()

    # 这里先让chatgpt生成情节梗概
    outline = generate_outline(name, background, style, tone )
    print("游戏梗概：")
    print(outline)

    game_over = False
    chat_history = []
    last_choice = None

    while not game_over:
        scene_data, new_message = generate_game_content(outline, tone, chat_history, last_choice)
        print(scene_data)
        # 解析返回的数据
        scene_data = json.loads(scene_data)
        is_over = scene_data.get('is_over') == 'true'
        content = scene_data.get('content')
        attribute = scene_data.get('attributes')
        # 打印用户属性
        print_attributes(attribute)
        # 打印场景内容
        print_scene_content(content)
        print("可选选项:")
        for option in scene_data.get('options'):
            print(option['id'], option['text'])

        # 更新聊天历史
        chat_history.append(new_message)
        print(chat_history)

        last_choice = input("请输入选项编号: ")

        game_over = is_over


if __name__ == "__main__":
    main()

'''
以下是测试效果
请输入您的姓名: aa

请输入故事背景:地狱

请选择故事风格:
1: 冒险
2: 悬疑
3: 浪漫
4: 恐怖
请输入编号: 2

请选择叙述语气:
1: 正式
2: 幽默
3: 严肃
4: 温馨
请输入编号: 2
aa 地狱 悬疑 幽默
游戏梗概：
在这个奇幻的地狱世界里，一个叫做"aa"的主角意外来到了这个充满阴谋和谜团的地方。aa发现自己被困在这个地狱中，而他唯一的出路是解开一个个悬疑重重的谜题。

在这个地狱中，奇怪的生物、诡异的场景、以及神秘的声音无处不在。而aa必须巧妙地利用他的智慧和机智，逐渐揭开这个地狱的面纱，找到通往自由的道路。

在探索的过程中，aa会遇到各种古怪的角色，有些对他友好，有些对他敌意。而在这种诡异又幽默的场景下，aa将面对一次次充满挑战和笑料的冒险，直到最终揭开这个地狱的最大谜团，找到通向自由的一线希望。
{
  "is_over": false,
  "attributes": {
    "health": 100,
    "experience": 0,
    "wealth": 0
  },
  "content": [
    {
      "type": 1,
      "text": "你闯进了地狱的大门，视野中弥漫着浓烈的硫磺气味，一切都笼罩在黑暗之中。你不知道怎么来到这里，但现在你的任务是解开地狱中的谜团，找到通向自由的道路。",
      "name": "",
      "dialogue": ""
    },
    {
      "type": 1,
      "text": "四周一片黑暗，你感到身边有微弱的光亮闪动。",
      "name": "",
      "dialogue": ""
    },
    {
      "type": 1,
      "text": "突然，一个小精灵出现在你眼前，他的蓝色皮肤和发光的眼睛让他看起来非常奇特。",
      "name": "",
      "dialogue": ""
    },
    {
      "type": 2,
      "text": "",
      "name": "小精灵",
      "dialogue": "嘿，你是新来的吗？看样子你好像陷入了困境。我是地狱的引路者，名叫比利。如果你想逃离这里，就得证明你有足够的能力。有两个黎明之门，一个通向自由，一个通向地狱之底。只有通过三个试炼，你才能找到出路。"
    },
    {
      "type": 1,
      "text": "你看着小精灵，思考着下一步该怎么办。",
      "name": "",
      "dialogue": ""
    }
  ],
  "image_prompt": "黑暗的地狱中，你看到远处有两扇发出微弱光芒的大门。",
  "options": [
    {
      "id": "1",
      "text": "询问比利关于试炼的详细信息"
    },
    {
      "id": "2",
      "text": "试图打开左边的黎明之门"
    },
    {
      "id": "3",
      "text": "试图打开右边的黎明之门"
    }
  ]
}
当前健康值： 100
当前经验值： 0
当前财富值： 0
场景描述: 你闯进了地狱的大门，视野中弥漫着浓烈的硫磺气味，一切都笼罩在黑暗之中。你不知道怎么来到这里，但现在你的任务是解开地狱中的谜团，找到通向自由的道路。
场景描述: 四周一片黑暗，你感到身边有微弱的光亮闪动。
场景描述: 突然，一个小精灵出现在你眼前，他的蓝色皮肤和发光的眼睛让他看起来非常奇特。
小精灵: 嘿，你是新来的吗？看样子你好像陷入了困境。我是地狱的引路者，名叫比利。如果你想逃离这里，就得证明你有足够的能力。有两个黎明之门，一个通向自由，一个通向地狱之底。只有通过三个试炼，你才能找到出路。
场景描述: 你看着小精灵，思考着下一步该怎么办。
可选选项:
1 询问比利关于试炼的详细信息
2 试图打开左边的黎明之门
3 试图打开右边的黎明之门
[{'role': 'assistant', 'content': '{\n  "is_over": false,\n  "attributes": {\n    "health": 100,\n    "experience": 0,\n    "wealth": 0\n  },\n  "content": [\n    {\n      "type": 1,\n      "text": "你闯进了地狱的大门，视野中弥漫着浓烈的硫磺气味，一切都笼罩在黑暗之中。你不知道怎么来到这里，但现在你的任务是解开地狱中的谜团，找到通向自由的道路。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 1,\n      "text": "四周一片黑暗，你感到身边有微弱的光亮闪动。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 1,\n      "text": "突然，一个小精灵出现在你眼前，他的蓝色皮肤和发光的眼睛让他看起来非常奇特。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 2,\n      "text": "",\n      "name": "小精灵",\n      "dialogue": "嘿，你是新来的吗？看样子你好像陷入了困境。我是地狱的引路者，名叫比利。如果你想逃离这里，就得证明你有足够的能力。有两个黎明之门，一个通向自由，一个通向地狱之底。只有通过三个试炼，你才能找到出路。"\n    },\n    {\n      "type": 1,\n      "text": "你看着小精灵，思考着下一步该怎么办。",\n      "name": "",\n      "dialogue": ""\n    }\n  ],\n  "image_prompt": "黑暗的地狱中，你看到远处有两扇发出微弱光芒的大门。",\n  "options": [\n    {\n      "id": "1",\n      "text": "询问比利关于试炼的详细信息"\n    },\n    {\n      "id": "2",\n      "text": "试图打开左边的黎明之门"\n    },\n    {\n      "id": "3",\n      "text": "试图打开右边的黎明之门"\n    }\n  ]\n}'}]
请输入选项编号: 1
{
  "is_over": false,
  "attributes": {
    "health": 100,
    "experience": 0,
    "wealth": 0
  },
  "content": [
    {
      "type": 2,
      "name": "比利",
      "dialogue": "试炼一：智力试炼。在地狱的迷宫中，你将面对一系列谜题和难题，只有解开它们，才能前进。试炼二：勇气试炼。你需要面对内心的恐惧和弱点，勇敢地克服。试炼三：决断试炼。最后，你将面临抉择，决定自己的命运。现在，你准备好了吗？"
    }
  ],
  "image_prompt": "比利的蓝色眼睛闪烁着神秘的光芒，仿佛能看穿你的内心。",
  "options": [
    {
      "id": "4",
      "text": "开始智力试炼"
    },
    {
      "id": "5",
      "text": "准备面对勇气试炼"
    },
    {
      "id": "6",
      "text": "迎接决断试炼"
    }
  ]
}
当前健康值： 100
当前经验值： 0
当前财富值： 0
比利: 试炼一：智力试炼。在地狱的迷宫中，你将面对一系列谜题和难题，只有解开它们，才能前进。试炼二：勇气试炼。你需要面对内心的恐惧和弱点，勇敢地克服。试炼三：决断试炼。最后，你将面临抉择，决定自己的命运。现在，你准备好了吗？
可选选项:
4 开始智力试炼
5 准备面对勇气试炼
6 迎接决断试炼
[{'role': 'assistant', 'content': '{\n  "is_over": false,\n  "attributes": {\n    "health": 100,\n    "experience": 0,\n    "wealth": 0\n  },\n  "content": [\n    {\n      "type": 1,\n      "text": "你闯进了地狱的大门，视野中弥漫着浓烈的硫磺气味，一切都笼罩在黑暗之中。你不知道怎么来到这里，但现在你的任务是解开地狱中的谜团，找到通向自由的道路。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 1,\n      "text": "四周一片黑暗，你感到身边有微弱的光亮闪动。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 1,\n      "text": "突然，一个小精灵出现在你眼前，他的蓝色皮肤和发光的眼睛让他看起来非常奇特。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 2,\n      "text": "",\n      "name": "小精灵",\n      "dialogue": "嘿，你是新来的吗？看样子你好像陷入了困境。我是地狱的引路者，名叫比利。如果你想逃离这里，就得证明你有足够的能力。有两个黎明之门，一个通向自由，一个通向地狱之底。只有通过三个试炼，你才能找到出路。"\n    },\n    {\n      "type": 1,\n      "text": "你看着小精灵，思考着下一步该怎么办。",\n      "name": "",\n      "dialogue": ""\n    }\n  ],\n  "image_prompt": "黑暗的地狱中，你看到远处有两扇发出微弱光芒的大门。",\n  "options": [\n    {\n      "id": "1",\n      "text": "询问比利关于试炼的详细信息"\n    },\n    {\n      "id": "2",\n      "text": "试图打开左边的黎明之门"\n    },\n    {\n      "id": "3",\n      "text": "试图打开右边的黎明之门"\n    }\n  ]\n}'}, {'role': 'assistant', 'content': '{\n  "is_over": false,\n  "attributes": {\n    "health": 100,\n    "experience": 0,\n    "wealth": 0\n  },\n  "content": [\n    {\n      "type": 2,\n      "name": "比利",\n      "dialogue": "试炼一：智力试炼。在地狱的迷宫中，你将面对一系列谜题和难题，只有解开它们，才能前进。试炼二：勇气试炼。你需要面对内心的恐惧和弱点，勇敢地克服。试炼三：决断试炼。最后，你将面临抉择，决定自己的命运。现在，你准备好了吗？"\n    }\n  ],\n  "image_prompt": "比利的蓝色眼睛闪烁着神秘的光芒，仿佛能看穿你的内心。",\n  "options": [\n    {\n      "id": "4",\n      "text": "开始智力试炼"\n    },\n    {\n      "id": "5",\n      "text": "准备面对勇气试炼"\n    },\n    {\n      "id": "6",\n      "text": "迎接决断试炼"\n    }\n  ]\n}'}]
请输入选项编号: 4
{
  "is_over": false,
  "attributes": {
    "health": 100,
    "experience": 0,
    "wealth": 0
  },
  "content": [
    {
      "type": 1,
      "text": "你进入了智力试炼的房间，四周墙壁上布满了古怪的符号和谜题。一台发出微弱光芒的机器摆放在房间中央。",
      "name": "",
      "dialogue": ""
    },
    {
      "type": 1,
      "text": "一位梦境造物主走了过来，手拿着一本看起来很古怪的书。",
      "name": "梦境造物主",
      "dialogue": "欢迎来到智力试炼，我会出一道谜题给你。听好了：什么东西朝上的时候是倒立的？"
    }
  ],
  "image_prompt": "智力试炼房间中央的光芒映射在墙壁上的符号上。",
  "options": [
    {
      "id": "7",
      "text": "回答：硬币"
    },
    {
      "id": "8",
      "text": "回答：雨伞"
    }
  ]
}
当前健康值： 100
当前经验值： 0
当前财富值： 0
场景描述: 你进入了智力试炼的房间，四周墙壁上布满了古怪的符号和谜题。一台发出微弱光芒的机器摆放在房间中央。
场景描述: 一位梦境造物主走了过来，手拿着一本看起来很古怪的书。
可选选项:
7 回答：硬币
8 回答：雨伞
[{'role': 'assistant', 'content': '{\n  "is_over": false,\n  "attributes": {\n    "health": 100,\n    "experience": 0,\n    "wealth": 0\n  },\n  "content": [\n    {\n      "type": 1,\n      "text": "你闯进了地狱的大门，视野中弥漫着浓烈的硫磺气味，一切都笼罩在黑暗之中。你不知道怎么来到这里，但现在你的任务是解开地狱中的谜团，找到通向自由的道路。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 1,\n      "text": "四周一片黑暗，你感到身边有微弱的光亮闪动。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 1,\n      "text": "突然，一个小精灵出现在你眼前，他的蓝色皮肤和发光的眼睛让他看起来非常奇特。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 2,\n      "text": "",\n      "name": "小精灵",\n      "dialogue": "嘿，你是新来的吗？看样子你好像陷入了困境。我是地狱的引路者，名叫比利。如果你想逃离这里，就得证明你有足够的能力。有两个黎明之门，一个通向自由，一个通向地狱之底。只有通过三个试炼，你才能找到出路。"\n    },\n    {\n      "type": 1,\n      "text": "你看着小精灵，思考着下一步该怎么办。",\n      "name": "",\n      "dialogue": ""\n    }\n  ],\n  "image_prompt": "黑暗的地狱中，你看到远处有两扇发出微弱光芒的大门。",\n  "options": [\n    {\n      "id": "1",\n      "text": "询问比利关于试炼的详细信息"\n    },\n    {\n      "id": "2",\n      "text": "试图打开左边的黎明之门"\n    },\n    {\n      "id": "3",\n      "text": "试图打开右边的黎明之门"\n    }\n  ]\n}'}, {'role': 'assistant', 'content': '{\n  "is_over": false,\n  "attributes": {\n    "health": 100,\n    "experience": 0,\n    "wealth": 0\n  },\n  "content": [\n    {\n      "type": 2,\n      "name": "比利",\n      "dialogue": "试炼一：智力试炼。在地狱的迷宫中，你将面对一系列谜题和难题，只有解开它们，才能前进。试炼二：勇气试炼。你需要面对内心的恐惧和弱点，勇敢地克服。试炼三：决断试炼。最后，你将面临抉择，决定自己的命运。现在，你准备好了吗？"\n    }\n  ],\n  "image_prompt": "比利的蓝色眼睛闪烁着神秘的光芒，仿佛能看穿你的内心。",\n  "options": [\n    {\n      "id": "4",\n      "text": "开始智力试炼"\n    },\n    {\n      "id": "5",\n      "text": "准备面对勇气试炼"\n    },\n    {\n      "id": "6",\n      "text": "迎接决断试炼"\n    }\n  ]\n}'}, {'role': 'assistant', 'content': '{\n  "is_over": false,\n  "attributes": {\n    "health": 100,\n    "experience": 0,\n    "wealth": 0\n  },\n  "content": [\n    {\n      "type": 1,\n      "text": "你进入了智力试炼的房间，四周墙壁上布满了古怪的符号和谜题。一台发出微弱光芒的机器摆放在房间中央。",\n      "name": "",\n      "dialogue": ""\n    },\n    {\n      "type": 1,\n      "text": "一位梦境造物主走了过来，手拿着一本看起来很古怪的书。",\n      "name": "梦境造物主",\n      "dialogue": "欢迎来到智力试炼，我会出一道谜题给你。听好了：什么东西朝上的时候是倒立的？"\n    }\n  ],\n  "image_prompt": "智力试炼房间中央的光芒映射在墙壁上的符号上。",\n  "options": [\n    {\n      "id": "7",\n      "text": "回答：硬币"\n    },\n    {\n      "id": "8",\n      "text": "回答：雨伞"\n    }\n  ]\n}'}]
请输入选项编号: 7
{
  "is_over": false,
  "attributes": {
    "health": 100,
    "experience": 0,
    "wealth": 0
  },
  "content": [
    {
      "type": 2,
      "name": "梦境造物主",
      "dialogue": "嘿，你真是个聪明的家伙！答案就是硬币。看来你在智力试炼中有不错的表现。继续前进吧，下一个试炼等着你。"
    }
  ],
  "image_prompt": "你感觉智慧的光芒在心中闪耀，赢得了梦境造物主的尊重。",
  "options": [
    {
      "id": "9",
      "text": "继续挑战下一个试炼"
    }
  ]
}
当前健康值： 100
当前经验值： 0
当前财富值： 0
梦境造物主: 嘿，你真是个聪明的家伙！答案就是硬币。看来你在智力试炼中有不错的表现。继续前进吧，下一个试炼等着你。
可选选项:
9 继续挑战下一个试炼

'''